// 全局状态管理核心类
class GlobalStore {
  constructor() {
    // 获取小程序全局实例
    this.app = getApp()
    // 初始化全局数据容器
    this.app.globalData = this.app.globalData || {}
    // 模块数据缓存
    this.modules = {}
    // 事件监听器
    this.listeners = {}
  }

  /**
   * 注册模块
   * @param {string} moduleName 模块名称
   * @param {Object} options 模块配置
   * @param {Object} options.state 初始状态
   * @param {Object} options.actions 模块方法
   * @param {Array} options.persist 需要持久化的字段数组
   */
  registerModule(moduleName, options) {
    const { state = {}, actions = {}, persist = [] } = options

    // 从本地存储加载持久化数据
    const persistedData = this._loadPersistedData(moduleName, persist)

    // 合并初始状态和持久化数据
    const moduleState = { ...state, ...persistedData }

    // 将模块状态挂载到全局变量
    this.app.globalData[moduleName] = moduleState

    // 创建模块访问器（getter/setter）
    const moduleAccessor = {
      // 状态访问
      get state() {
        return this.app.globalData[moduleName]
      },

      // 直接修改状态并触发更新
      setState(newState) {
        if (typeof newState === 'function') {
          newState = newState(this.state)
        }
        this.app.globalData[moduleName] = { ...this.state, ...newState }
        this._savePersistedData(moduleName, persist)
        this._emitChange(moduleName)
      },

      // 模块方法绑定
      ...Object.keys(actions).reduce((acc, actionName) => {
        acc[actionName] = (...args) => {
          return actions[actionName].call(this, this.state, ...args)
        }
        return acc
      }, {})
    }

    // 缓存模块访问器
    this.modules[moduleName] = moduleAccessor

    return moduleAccessor
  }

  /**
   * 获取模块
   * @param {string} moduleName 模块名称
   * @returns {Object} 模块访问器
   */
  getModule(moduleName) {
    if (!this.modules[moduleName]) {
      console.error(`未找到模块: ${moduleName}`)
      return null
    }
    return this.modules[moduleName]
  }

  /**
   * 监听模块数据变化
   * @param {string} moduleName 模块名称
   * @param {Function} callback 回调函数
   */
  onModuleChange(moduleName, callback) {
    if (!this.listeners[moduleName]) {
      this.listeners[moduleName] = []
    }
    this.listeners[moduleName].push(callback)
  }

  /**
   * 移除模块监听
   * @param {string} moduleName 模块名称
   * @param {Function} callback 回调函数
   */
  offModuleChange(moduleName, callback) {
    if (!this.listeners[moduleName]) return
    this.listeners[moduleName] = this.listeners[moduleName].filter(cb => cb !== callback)
  }

  /**
   * 触发模块变化事件
   * @param {string} moduleName 模块名称
   */
  _emitChange(moduleName) {
    if (this.listeners[moduleName]) {
      const currentState = this.app.globalData[moduleName]
      this.listeners[moduleName].forEach(callback => {
        callback(currentState)
      })
    }
  }

  /**
   * 加载持久化数据
   * @param {string} moduleName 模块名称
   * @param {Array} persist 持久化字段
   */
  _loadPersistedData(moduleName, persist) {
    if (!persist.length) return {}

    try {
      const stored = wx.getStorageSync(`store_${moduleName}`)
      if (typeof stored === 'object' && stored !== null) {
        // 只返回指定的持久化字段
        return persist.reduce((acc, key) => {
          if (stored.hasOwnProperty(key)) {
            acc[key] = stored[key]
          }
          return acc
        }, {})
      }
    } catch (e) {
      console.error(`加载${moduleName}持久化数据失败:`, e)
    }
    return {}
  }

  /**
   * 保存持久化数据
   * @param {string} moduleName 模块名称
   * @param {Array} persist 持久化字段
   */
  _savePersistedData(moduleName, persist) {
    if (!persist.length) return

    try {
      const state = this.app.globalData[moduleName]
      // 只保存指定的持久化字段
      const dataToPersist = persist.reduce((acc, key) => {
        if (state.hasOwnProperty(key)) {
          acc[key] = state[key]
        }
        return acc
      }, {})
      wx.setStorageSync(`store_${moduleName}`, dataToPersist)
    } catch (e) {
      console.error(`保存${moduleName}持久化数据失败:`, e)
    }
  }
}

// 初始化全局状态管理器
const store = new GlobalStore()

// 自动注册所有模块
const files = import.meta.glob('./*.js', { eager: true })
Object.keys(files).forEach((key) => {
  const moduleName = key.replace(/(.*\/)*([^.]+).*/gi, '$2')
  // 跳过index.js自身
  if (moduleName === 'index') return
  // 注册模块
  if (files[key].default) {
    store.registerModule(moduleName, files[key].default)
  }
})

// 导出工具函数
export const useStore = (moduleName) => {
  return store.getModule(moduleName)
}

export const onStoreChange = (moduleName, callback) => {
  store.onModuleChange(moduleName, callback)
}

export const offStoreChange = (moduleName, callback) => {
  store.offModuleChange(moduleName, callback)
}

export default store